/*
 * EstacionDepositoEquipaje.cpp
 *
 *  Created on: Oct 15, 2013
 *      Author: m
 */

#include "EstacionDepositoEquipaje.h"

using namespace ipc;

EstacionDepositoEquipaje::EstacionDepositoEquipaje() :
    m_shmContadorEquipaje(
            SharedMemory<int>::get( IPC_BASE_FILE, SHM_CONT_EQUIPAJE ) ),
    m_mutexContadorEquipaje(
            Semaphore::get( IPC_BASE_FILE, MUTEX_CONT_EQUIPAJE ) ),
    m_cintaEquipajeSinVerificar(
            MessageQueue<MensajeEquipaje>::get( IPC_BASE_FILE,
                    MQ_SIN_VERIF ) )
{
}

EstacionDepositoEquipaje::~EstacionDepositoEquipaje()
{
}

void EstacionDepositoEquipaje::depositarEquipaje( Equipaje &equipaje,
        IdVuelo vuelo )
{
    MensajeEquipaje mensaje;
    int contadorEquipaje;

    mensaje.setVuelo( vuelo );
    mensaje.setContenido( equipaje );

    // Incremento la cantidad de equipaje depositada para el vuelo dado
    m_mutexContadorEquipaje.wait( vuelo - 1 );

    contadorEquipaje = m_shmContadorEquipaje.read( vuelo - 1 );
    contadorEquipaje++;
    m_shmContadorEquipaje.write( contadorEquipaje, vuelo - 1 );

    m_mutexContadorEquipaje.signal( vuelo - 1 );

    // Deposito el equipaje en la cinta correspondiente
    m_cintaEquipajeSinVerificar.put( vuelo, mensaje );
}
